\chapter{项目设计}

\section{数据库设计}
\subsection{点餐业务流}
Business（商家）
\begin{table}[h]
    \caption{商家表}\label{tab:Busi_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabularx}{\textwidth}{m{0.5cm}<{\centering} m{2cm}<{\centering} 
        m{2cm}<{\centering} m{1cm}<{\centering} m{1.2cm}<{\centering} 
        m{2.3cm}<{\centering} m{3cm}<{\centering}}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & businessID & int & ~ & ~ & PK、AI、NN & 商家编号\\
    2 & businessName & varchar & 40 & ~ & NN & 商家名称\\
    3 & businessAddress & varchar & 50 & ~ & ~ & 商家地址\\
    4 & businessExplain & varchar & 40 & ~ & ~ & 商家介绍\\
    5 & businessImg & medium text & ~ & ~ & NN & 商家图片\\
    6 & orderTypeId & int & ~ & ~ & NN & 点餐分类： 

        1：美食

        2：早餐

        3：跑腿代购

        4：汉堡、披萨

        5：甜品、饮品

        6：速食、简餐

        7：地方小吃

        8：米粉、面馆

        9：包子粥铺

        10：炸鸡炸串

    \\
    7 & startPrice & decimal & (5,2) & 0.00 & ~ & 起送费\\
    8 & deliveryPrice & decimal & (5,2) & 0.00 & ~ & 配送费\\
    9 & remarks & varchar & 40 & ~ & ~ & 备注\\
    10 & ownerUserId & varchar & 20 & ~ & NN、FK & 商家的用户id\\
    \bottomrule[1.5pt]
    \end{tabularx}
    \vspace{\baselineskip}
\end{table}
\clearpage
Food（食品表）
\begin{table}[h]
    \caption{食品表}\label{tab:Food_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & foodId & int & ~ & ~ & PK、AI、NN & 食品编号\\
    2 & foodName & varchar & 30 & ~ & NN & 食品名称\\
    3 & foodExplain & varchar & 30 & ~ & NN & 食品介绍\\
    4 & foodImg & medium text & ~ & ~ & NN & 食品图片\\
    5 & foodPrice & decimal & (5,2) & ~ & NN & 食品价格\\
    6 & businessId & int & ~ & ~ & FK、NN & 所属商家编号\\
    7 & remarks & varchar & 40 & ~ & ~ & 备注\\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}

orders（订单表）
\begin{table}[h]
    \caption{订单表}\label{tab:orders_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & orderId & int & & & PK、AI、NN & 订单编号\\
    2 & userId & varchar & 20 & & FK、NN & 所属用户编号\\
    3 & businessId & int & & & FK、NN & 所属商家编号\\
    4 & orderDate & varchar & 20 & & NN & 订购日期\\
    5 & orderTotal & decimal & (7,2) & 0.00 & NN & 订购总价\\
    6 & daId & int & & & FK、NN & 所属送货地址编号\\
    7 & orderState & int & & 0 & NN & 订单状态：0：未支付；1：已支付\\
    8 & riderId & varchar & 20 & & FK、NN & 接单骑手的用户编号\\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}
\clearpage
cart（购物车表）
\begin{table}[h]
    \caption{购物车表}\label{tab:cart_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & cartId & int & ~ & ~ & PK、AI、NN & 无意义编号\\
    2 & foodId & int & & & FK、NN & 食品编号\\
    3 & businessId & int & & & FK、NN & 所属商家编号\\
    4 & userId & varchar & 20 & & FK、NN & 所属用户编号\\
    5 & quantity & int & & & NN & 同一类型食品的购买数量\\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}


orderdetailet（订单明细表）
\begin{table}[h]
    \caption{订单明细表}\label{tab:Orderdetailet_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & odId & int & & & PK、AI、NN & 订单明细编号\\
    2 & orderId & int & & & FK、NN & 所属订单编号\\
    3 & foodId & int & & & FK、NN & 所属食品编号\\
    4 & quantity & int & & & NN & 数量\\
    5 & foodprice & decimal & (10,2) & & NN & 单个食物价格\\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}
\clearpage
deliveryaddress（送货地址）
\begin{table}[h]
    \caption{送货地址表}\label{tab:addressd_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & daId & int & & & PK、AI、NN & 送货地址编号\\
    2 & contactName & varchar & 20 & & NN & 联系人姓名\\
    3 & contactSex & int & & & NN & 联系人性别\\
    4 & contactTel & varchar & 20 & & NN & 联系人电话\\
    5 & address & varchar & 100 & & NN & 送货地址\\
    6 & userId & varchar & 20 & & FK、NN & 所属用户编号\\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}

uers（用户表）
\begin{table}[h]
    \caption{用户表}\label{tab:uers_table}
    \vspace{0.5em}\centering\wuhao
    \begin{tabular}{ccccccc}
    \toprule[1.5pt]
    NO & 字段名 & 数据类型 & 大小 & 默认值 & 约束 & 说明\\
    \midrule[1pt]
    1 & userId & varchar & 20 & & PK、NN & 用户编号\\
    2 & password & varchar & 70 & & NN & 密码\\
    3 & userName & varchar & 20 & & NN & 用户名称\\
    4 & userSex & int & & & NN & 用户性别
    1：男；
    0：女；
    \\
    5 & userImg & medium text & & & & 用户头像\\
    6 & delTag & int & & 1 & NN & 删除标记
    1：正常；
    0：删除；
    \\
    7 & type & int & & 1 & & 用户类型
    1：顾客；
    2：商家；
    3：骑手；
    \\
    \bottomrule[1.5pt]
    \end{tabular}
    \vspace{\baselineskip}
\end{table}
\clearpage

\section{接口设计}
\subsection{点餐业务流：}
\begin{enumerate}
    \item business
    \begin{enumerate}
    \item BusinessController/listBusinessByOrderTypeId。
    
    参数：orderTypeId

    返回值：business数组

    功能：根据点餐分类编号查询所属商家信息
    \item BusinessController/getBusinessById
    
    参数：businessId
   
    返回值：business对象
    
    功能：根据商家编号查询商家信息
    \item BusinessController/getBusinessByOwnerId
    
    参数：ownerUserId
    
    返回值：business对象
    
    功能：根据商家拥有者的用户编号查询商家信息
    \end{enumerate}

    \item food
    \begin{enumerate}
    \item FoodController/listFoodByBusinessId
    
    参数：businessId
    
    返回值：food数组
    
    功能：根据商家编号查询所属食品信息
    \end{enumerate}

    \item cart
    \begin{enumerate}
    \item CartController/listCart
    
    参数：userId、businessId（可选）
    
    返回值：cart数组（多对一：所属商家信息、所属食品信息）

    功能：

        \begin{itemize}
            \item 根据用户编号查询此用户所有购物车信息；
            \item 根据用户编号和商家编号，查询此用户购物车中某个商家的所有购物车信息。
        \end{itemize}
    
    \item CartController/saveCart
    
    参数：userId、businessId、foodId
    
    返回值：int（影响的行数）
    
    功能：向购物车表中添加一条记录
    \clearpage
    \item CartController/updateCart
    
    参数：userId、businessId、foodId、quantity
    
    返回值：int（影响的行数）
    
    功能：根据用户编号、商家编号、食品编号更新数量
    
    \item CartController/removeCart
    
    参数：userId、businessId、foodId（可选）
    
    返回值：int（影响的行数）
    
    功能：

        \begin{itemize}
            \item 根据用户编号、商家编号、食品编号删除购物车表中的一条食品记录；
            \item 根据用户编号、商家编号删除购物车表中的多条记录
        \end{itemize}

    \end{enumerate}

    \item deliveryAddress
    \begin{enumerate}
        \item DeliveryAddressController/listDeliveryAddressByUserId
        
        参数：userId
        
        返回值：deliveryAddress数组
        
        功能：根据用户编号查询所属送货地址
        \item DeliveryAddressController/getDeliveryAddressById
        
        参数：daId
        
        返回值：deliveryAddress对象
        
        功能：根据送货地址编号查询送货地址
        \item DeliveryAddressController/saveDeliveryAddress
        
        参数：contactName、contactSex、contactTel、address、userId
        
        返回值：int（影响的行数）
        
        功能：向送货地址表中添加一条记录
        \item DeliveryAddressController/updateDeliveryAddress
        
        参数：daId、contactName、contactSex、contactTel、address、userId
        
        返回值：int（影响的行数）
        
        功能：根据送货地址编号更新送货地址信息
        \item DeliveryAddressController/removeDeliveryAddress
       
        参数：daId
        
        返回值：int（影响的行数）
        
        功能：根据送货地址编号删除一条记录
    \end{enumerate}

    \item orders
    \begin{enumerate}
        \item OrdersController/createOrders
        
        参数：userId、businessId、daId、orderTotal
        
        返回值：int（订单编号）
        
        功能：根据用户编号、商家编号、订单总金额、送货地址编号向订单表中添加一条记录，并获取自动生成的订单编号，然后根据用户编号、商家编号从购物车表中查询所有数据，批量添加到订单明细表中，然后根据用户编号、商家编号删除购物车表中的数据。

        \item OrdersController/getOrdersById

        参数：orderId

        返回值：orders对象（包括多对一：商家信息；一对多：订单明细信息）

        功能：根据订单编号查询订单信息，包括所属商家信息和此订单的所有订单明细信息

        \item OrdersController/listOrdersByUserId
        
        参数：userId
        
        返回值：orders数组（包括多对一：商家信息；一对多：订单明细信息）
        
        功能：根据用户编号查询此用户的所有订单信息
        
        \item OrdersController/updateOrdersState
        
        参数：ordersId、orderState
        
        返回值：int（影响的行数）
       
        功能：修改订单状态
    \end{enumerate}

    \item user
    \begin{enumerate}
        \item UserController/getUserByIdByPass
        
        参数：userId、password
        
        返回值：users对象
        
        功能：根据用户编号与密码查询用户信息
        
        \item UserController/getUserById
        
        参数：userId
        
        返回值：int（返回行数）
        
        功能：根据用户编号查询用户表返回的行数
        
        \item UserController/saveUser
        
        参数：userId、password、userName、userSex
        
        返回值：int（影响的行数）
        
        功能：向用户表中添加一条记录
    \end{enumerate}
\end{enumerate}
\clearpage

\section{架构设计}
\subsection{分布式原则}
采用分布式架构，将系统拆分为多个独立的服务，以实现系统功能的
解耦、降低系统复杂度、提高可扩展性和可维护性。


\subsection{微服务原则}
基于微服务架构，将系统功能拆分为多个单一职责的微服务，每个微
服务独立部署、独立维护，保证微服务间的高内聚、低耦合。

创建每个微服务时，项目采用基于Servlet的简易MVC架构，采用约定优于配置的原则来搭建简易MVC框架，如下图所示：
\begin{figure}[h]
    \centering
    \includegraphics[width=1\textwidth]{MVC}
    \caption{MVC架构图}\label{fig:MVC}
    \vspace{\baselineskip}
\end{figure}
\subsection{高可用原则}
通过负载均衡、熔断降级、容错处理等手段，确保系统在面临异常情
况时，仍能保持可用状态，提高系统的稳定性和可靠性。
